diff --git a/system/helpers/cookie_helper.php b/system/helpers/cookie_helper.php
index b117816..9dc5df9 100644
--- a/system/helpers/cookie_helper.php
+++ b/system/helpers/cookie_helper.php
@@ -1,126 +1,126 @@
-<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');
-/**
- * Code Igniter
- *
- * An open source application development framework for PHP 4.3.2 or newer
- *
- * @package		CodeIgniter
- * @author		Rick Ellis
- * @copyright	Copyright (c) 2006, pMachine, Inc.
- * @license		http://www.codeignitor.com/user_guide/license.html
- * @link		http://www.codeigniter.com
- * @since		Version 1.0
- * @filesource
- */
-
-// ------------------------------------------------------------------------
-
-/**
- * Code Igniter Cookie Helpers
- *
- * @package		CodeIgniter
- * @subpackage	Helpers
- * @category	Helpers
- * @author		Rick Ellis
- * @link		http://www.codeigniter.com/user_guide/helpers/cookie_helper.html
- */
-
-// ------------------------------------------------------------------------
-
-/**
- * Set cookie
- *
- * Accepts six parameter, or you can submit an associative
- * array in the first parameter containing all the values.
- *
- * @access	public
- * @param	mixed
- * @param	string	the value of the cookie
- * @param	string	the number of seconds until expiration
- * @param	string	the cookie domain.  Usually:  .yourdomain.com
- * @param	string	the cookie path
- * @param	string	the cookie prefix
- * @return	void
- */
-function set_cookie($name = '', $value = '', $expire = '', $domain = '', $path = '/', $prefix = '')
-{
-	if (is_array($name))
-	{		
-		foreach (array('value', 'expire', 'domain', 'path', 'prefix', 'name') as $item)
-		{
-			if (isset($name[$item]))
-			{
-				$$item = $name[$item];
-			}
-		}
-	}
-	
-	// Set the config file options
-	$CI =& get_instance();
-	
-	if ($prefix == '' AND $CI->config->item('cookie_prefix') != '')
-	{
-		$CI->config->item('cookie_prefix');
-	}
-	if ($domain == '' AND $CI->config->item('cookie_domain') != '')
-	{
-		$CI->config->item('cookie_domain');
-	}
-	if ($prefix == '/' AND $CI->config->item('cookie_path') != '/')
-	{
-		$CI->config->item('cookie_path');
-	}
-		
-	if ( ! is_numeric($expire))
-	{
-		$expire = time() - 86500;
-	}
-	else
-	{
-		if ($expire > 0)
-		{
-			$expire = time() + $expire;
-		}
-		else
-		{
-			$expire = 0;
-		}
-	}
-	
-	setcookie($prefix.$name, $value, $expire, $path, $domain, 0);
-}
-	
-// --------------------------------------------------------------------
-
-/**
- * Fetch an item from the COOKIE array
- *
- * @access	public
- * @param	string
- * @param	bool
- * @return	mixed
- */
-function get_cookie($index = '', $xss_clean = FALSE)
-{
-	$CI =& get_instance();
-	return $CI->input->cookie($index, $xss_clean);
-}
-
-// --------------------------------------------------------------------
-
-/**
- * Delete a COOKIE
- *
- * @param	mixed
- * @param	string	the cookie domain.  Usually:  .yourdomain.com
- * @param	string	the cookie path
- * @param	string	the cookie prefix
- * @return	void
- */
-function delete_cookie($name = '', $domain = '', $path = '/', $prefix = '')
-{
-	set_cookie($name, '', '', $domain, $path, $prefix);
-}
-
-
+<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		Rick Ellis
+ * @copyright	Copyright (c) 2006, EllisLab, Inc.
+ * @license		http://www.codeignitor.com/user_guide/license.html
+ * @link		http://www.codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CodeIgniter Cookie Helpers
+ *
+ * @package		CodeIgniter
+ * @subpackage	Helpers
+ * @category	Helpers
+ * @author		Rick Ellis
+ * @link		http://www.codeigniter.com/user_guide/helpers/cookie_helper.html
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Set cookie
+ *
+ * Accepts six parameter, or you can submit an associative
+ * array in the first parameter containing all the values.
+ *
+ * @access	public
+ * @param	mixed
+ * @param	string	the value of the cookie
+ * @param	string	the number of seconds until expiration
+ * @param	string	the cookie domain.  Usually:  .yourdomain.com
+ * @param	string	the cookie path
+ * @param	string	the cookie prefix
+ * @return	void
+ */
+function set_cookie($name = '', $value = '', $expire = '', $domain = '', $path = '/', $prefix = '')
+{
+	if (is_array($name))
+	{		
+		foreach (array('value', 'expire', 'domain', 'path', 'prefix', 'name') as $item)
+		{
+			if (isset($name[$item]))
+			{
+				$$item = $name[$item];
+			}
+		}
+	}
+	
+	// Set the config file options
+	$CI =& get_instance();
+	
+	if ($prefix == '' AND $CI->config->item('cookie_prefix') != '')
+	{
+		$CI->config->item('cookie_prefix');
+	}
+	if ($domain == '' AND $CI->config->item('cookie_domain') != '')
+	{
+		$CI->config->item('cookie_domain');
+	}
+	if ($prefix == '/' AND $CI->config->item('cookie_path') != '/')
+	{
+		$CI->config->item('cookie_path');
+	}
+		
+	if ( ! is_numeric($expire))
+	{
+		$expire = time() - 86500;
+	}
+	else
+	{
+		if ($expire > 0)
+		{
+			$expire = time() + $expire;
+		}
+		else
+		{
+			$expire = 0;
+		}
+	}
+	
+	setcookie($prefix.$name, $value, $expire, $path, $domain, 0);
+}
+	
+// --------------------------------------------------------------------
+
+/**
+ * Fetch an item from the COOKIE array
+ *
+ * @access	public
+ * @param	string
+ * @param	bool
+ * @return	mixed
+ */
+function get_cookie($index = '', $xss_clean = FALSE)
+{
+	$CI =& get_instance();
+	return $CI->input->cookie($index, $xss_clean);
+}
+
+// --------------------------------------------------------------------
+
+/**
+ * Delete a COOKIE
+ *
+ * @param	mixed
+ * @param	string	the cookie domain.  Usually:  .yourdomain.com
+ * @param	string	the cookie path
+ * @param	string	the cookie prefix
+ * @return	void
+ */
+function delete_cookie($name = '', $domain = '', $path = '/', $prefix = '')
+{
+	set_cookie($name, '', '', $domain, $path, $prefix);
+}
+
+
 ?>
\ No newline at end of file
